package com.cskaoyan.javase.oop2._1extends._9override._2grammar;

/**
 * 父子类中出现同名成员变量是没有任何语法限制的
 * 但是父子类中出现同名成员方法是有固定的语法格式的
 * 称之为"方法的重写/覆盖(override)"
 *
 * Java中提供了检测某个方法是否重写自父类的语法
 * 使用注解: @Override
 * 该注解写在子类重写父类方法的方法头上面,用来检测该方法是否重写自父类
 * 如果是,则代码不会报错,否者代码会报错.
 *
 * 语法:
 * 对于一个父类中的成员方法:
 * [访问权限修饰符] 返回值类型 方法名(形参列表){
 *     // 方法体
 * }
 * 方法的重写语法要求,子类中重写的方法必须:
 *      1.访问权限修饰符子类可以改吗?
 *      可以,但是有限制,不是乱改的
 *      可以变得更宽松,当然也可以保持一致,但一定不能变得更严格
 *      当然如果父类方法的访问权限是public,那么子类必须保持一致,无法修改.
 *
 *      2.返回值类型能不能改呢?
 *      可以改,但是条件比较苛刻,绝大多数情况下是改不了的
 *      到底什么情况下可以改呢?(今天晚上大家自己测试一下)
 *      思路: 考虑基本数据类型和引用数据类型的返回值类型,考虑自动类型转换
 *      void肯定是不能改的
 *      3.方法名,肯定不能改,方法名相同是必须的
 *      4.形参列表是一定不能改的,必须保证完全一致.
 *          注: 形参的名字无所谓,是可以改的
 *      5.方法体,无所谓,想改可以改,不想改也可以,保持空着都行.
 *
 * 方法的重写(override) vs 方法的重载(overload)
 * 相同点:(它们的相同点非常少)
 *      1.两个个方法之间,方法名都必须一样
 *      2.对方法体都没有要求,随便写,无所谓
 *
 * 不同点:
 *      1.方法的重载必须发生在同一个类当中,方法的重写必须在父子类之间,两个类之间.
 *      2.方法的重载不关心访问权限修饰符,方法的重写访问权限可以更宽松,也可以保持一致,但是不能更严格
 *      3.方法的重载不关心返回值类型,方法的重写是有要求的
 *      4.方法的重载要求形参列表必须不同,而方法重写要求形参列表必须一样
 *          注: 形参的名字不影响形参列表本身,数据类型,个数,顺序等才影响
 *
 * @since 15:08
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

class Father {
    void test(int a) {

    }
}

class Son extends Father {
    @Override
    void test(int b) {
        System.out.println();
    }
}